﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Objects;

namespace ControlePonto.Models
{
    /// Classe gerenciadora do contexto do Entity Framework. Utiliza generics 
    /// para determinar em tempo de execução o tipo do contexto e Reflection 
    /// para instanciar o tipo genérico. Armazena o contexto no HttpContext, 
    /// de modo que não seja necessário instanciar o contexto nas próximas 
    /// chamadas dentro da requisição web.
    public static class ContextManager
    {

        /// Obtém o contexto do Entity Framework usando generics.
        public static TObjectContext GetContext<TObjectContext>()
            where TObjectContext : ObjectContext
        {
            string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString("x");

            if (HttpContext.Current != null)
            {
                if (!HttpContext.Current.Items.Contains(ocKey))
                {
                    // Instancia o contexto através de Reflection
                    TObjectContext ctx = typeof(TObjectContext).GetConstructor(System.Type.EmptyTypes)
                                     .Invoke(System.Type.EmptyTypes) as TObjectContext;

                    // Armazena na requisição
                    HttpContext.Current.Items.Add(ocKey, ctx);
                }

                return HttpContext.Current.Items[ocKey] as TObjectContext;
            }
            else
                // Caso a aplicação não seja web, instancia e retorna o contexto.
                return typeof(TObjectContext).GetConstructor(System.Type.EmptyTypes)
                                .Invoke(System.Type.EmptyTypes) as TObjectContext;
        }
    }
}